#pragma once

#include <string>
#include <vector>
#if defined(_WIN32)
#if defined(EXPORTING_FileSystem)
#define Utility_FileSystem_DECLSPEC __declspec (dllexport)
#else
#define Utility_FileSystem_DECLSPEC __declspec (dllimport)
#endif
#else  // non windows
#define Utility_FileSystem_DECLSPEC
#endif

namespace SG::Utility::FileSystem
{
    /**
     * @brief   : 输入文件夹路径与文件后缀，返回文件夹内所有同后缀文件
     *
     * @param   : folderPath      [in]     文件夹路径
     * @param   : extension       [in]     文件后缀  eg:".txt"
     * @return  : std::vector<std::string>
     * @author  : ql
     * @date    : 2024.10.31
     */
    Utility_FileSystem_DECLSPEC std::vector<std::string> getFilesWithExtension (const std::string& folderPath,
                                                                                const std::string& extension);

    /// @brief 获取测试数据的绝对路径
    /// @param relativePath 相对于TestData目录的相对路径
    /// @return 测试数据的绝对路径
    /// @author wxc
    /// @date 2024.09.04
    Utility_FileSystem_DECLSPEC std::string getTestDataPath (const std::string& relativePath);

    /**
     * @brief   : 输入文件路径，返回文件夹名称与文件名称
     *  输入            期待输出文件夹名称            文件名称
     * ./test.txt                 .                 test.txt
     *  test.txt                                    test.txt
     * c:/sg/test.txt           c:/sg               test.txt
     * /home/sg/test.txt      /home/sg              test.txt
     *
     * @param   : filePath      [in]     文件路径
     * @param   : directoryPath [out]    抽取出的文件夹路径
     * @param   : fileName      [out]    抽取出的文件名称
     * @return  :
     * @author  : ql
     * @date    : 2024.10.23
     */
    Utility_FileSystem_DECLSPEC void extractDirectoryAndFileName (const char* filePath, std::string& directoryPath, std::string& fileName);

    /** @brief 获取当前程序工作路径下相对路径的绝对路径
     *  @param [in] relativePath 相对路径
     *  @return 当前程序工作路径下相对路径的绝对路径
     *  @author duweixing    2024.07.25
     */
    Utility_FileSystem_DECLSPEC std::string getFullPath (const std::string& relativePath);

    /** @brief 获取当前程序的工作路径（绝对路径），即运行路径
     *  @return 成功返回当前程序的工作路径（绝对路径）；失败返回空串
     *  @author duweixing    2024.03.30
     */
    Utility_FileSystem_DECLSPEC std::string getWorkingDirectory ();

    /** @brief 比较两个文本文件内容是否相同
     *
     * 分别读取两个文件的所有行，通过字符串连接形成文本文件对应的字符串，
     * 比较两个字符串内 容确定文本文件内容是否相同。</p>
     * 此函数主要用于测试输出为文本的情况，判定输出文本内容是否和期望一致。
     */

    Utility_FileSystem_DECLSPEC bool compareTextFile (const std::string& filename1, const std::string& filename2);

    /**
     * @brief 比较两个VTK内的结果数据
     *
     * @param vtk1 文件1
     * @param vtk2 文件2
     * @param tolerance 容差 默认 1.0e-6
     * @return true
     * @return false
     */
    Utility_FileSystem_DECLSPEC bool compareVTK (const std::string& vtk1, const std::string& vtk2, const double tolerance = 1.0e-6);

    /**
     * @brief 获取当前可执行文件的绝对路径
     *
     * @return std::string
     */
    Utility_FileSystem_DECLSPEC std::string getCurrentExecutablePath ();

}  // namespace SG::Utility::FileSystem
